package com.skt.config;

import com.skt.utils.JwtUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import java.security.PublicKey;

/**
 * 主配置类定义
 */
@Configuration // 告诉 Spring 这是一个配置类，里面的 @Bean 方法会被容器管理。
@EnableWebSecurity // 开启 Spring Security 的 Web 安全功能（自动注册过滤器链等）。
@RequiredArgsConstructor
public class SecurityConfig {

    private final JwtUtil jwtUtil;

    /**
     * 密码编码器 Bean
     * @return
     */

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     *  安全过滤器链配置（核心）
     * @param http
     * @return
     * @throws Exception
     */
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthenticationFilter jwtFilter) throws Exception { // 👈 添加 jwtFilter 参数
        http
                // 启用 CORS（使用 CorsConfig 中的配置）
                .cors().and()
                // 1️⃣ 禁用 CSRF（跨站请求伪造保护）
                .csrf().disable()
                // 2️⃣ 设置无状态 Session（适合 JWT）
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                // 3️⃣ 配置请求授权规则
                .and()
                .authorizeRequests() // ⬅️ 注意：这里用 authorizeRequests() 而不是 authorizeHttpRequests()
                // 4️⃣ 放行公开路径（无需认证）
                .antMatchers(
                        // 用户模块：放行所有明确需要公开的 /user 下的接口（未来新增只需加在这里）
                        "/user/login",
                        "/user/register",
                        "/user/test",
                        "/user/sendCode",          // 示例：新增的公开接口
                        "/user/checkUsername/**",  // 支持带参数的路径

                        // Swagger & Knife4j（保持不变）
                        "/doc.html",
                        "/swagger-resources/**",
                        "/webjars/**",
                        "/v3/api-docs/**",
                        // 系统静态资源
                        "/favicon.ico",
                        "/error"
                ).permitAll()
                // 5️⃣ 其他所有请求必须认证
                .anyRequest().authenticated()
                // 6️⃣ 禁用默认登录/登出行为
                .and()
                .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) // ✅ 新增这一行（注册 JWT 过滤器）
                .formLogin().disable()
                .httpBasic().disable()
                .logout().disable();

        // 7️⃣ 构建并返回安全链
        return http.build();
    }

    /**
     * 将 PublicKey 注册为 Spring Bean
     */
    @Bean
    public PublicKey publicKey() {
        return jwtUtil.getPublicKey();
    }

}

/**
 * 功能	说明
 * ✅ 密码加密	提供 BCryptPasswordEncoder Bean
 * ✅ 无状态认证	不创建 Session，适合 JWT
 * ✅ 放行公开接口	如登录、注册、验证码、Swagger
 * ✅ 拦截私有接口	除公开路径外，所有接口需认证
 * ✅ 禁用干扰功能	关闭默认登录页、HTTP Basic、CSRF
 * ✅ 前后端分离友好	返回 401 而不是跳转页面
 */